package com.sunny.design.template.simple;

/**
 * 模板模式（Template Pattern）
 *  模板模式通常又叫模板方法模式（Template Method Pattern）是指定义一个算法的骨架，并允许子类为一个或者多个步骤提供实现
 *
 *  模板方法使得子类可以在不改变算法结构的情况下，重新定义算法的某些步骤。
 *
 *  属于行为性设计模式。
 *
 * @author Sunny
 * @date 2020/1/9 22:50
 */
public abstract class Course {

    /**
     * 创建课程
     */
    protected final void createCourse() {
        try {
            //1、发布预习资料
            postPreResource();
            //2、制作PPT
            createPPT();
            //3、直播
            life();
            //4、提交课件、课堂笔记
            postNote();
            //5、提交源码
            postSource();
            //6、布置作业，有些课没作业，有些课有作业
            //判断是否有作业，有的话检查作业
            if (hasHomework()) {
                checkHomework();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected abstract void checkHomework();

    /**
     * 钩子方法
     *  实现流程的微调，通过子类来控制是否执行不同流程
     */
    protected boolean hasHomework() {
        return false;
    }

    final void postSource() {
        System.out.println("发布源码");
    }

    final void postNote() {
        System.out.println("提交作业");
    }

    final void life() {
        System.out.println("直播");
    }

    final void createPPT() {
        System.out.println("制作PPT");
    }

    final void postPreResource() {
        System.out.println("发布预习资料");
    }
}
